home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 58189 / 58189.xpi / modules / Whitelist.jsm < prev   
Text File  |  2010-01-07  |  6KB  |  222 lines

  1. /*
  2.  * This class implements a whitelist for domains. This means that certain
  3.  * domains can be freed from policy decisions.
  4.  
  5.  * ATTENTION: initialization is done by loadList(), but can not be done at
  6.  * startup time. Apparantly, Firefox does not find the preferences and thinks
  7.  * they are not set. Only after loading the browser, the prefs are available.
  8.  */
  9.  
  10. var EXPORTED_SYMBOLS = [ ];
  11. Components.utils.import("resource://csfiremodules/CsFireCommon.jsm");
  12.  
  13. CsFire.nsJSON = Components.classes["@mozilla.org/dom/json;1"].createInstance(Components.interfaces.nsIJSON);
  14.  
  15. CsFire.Whitelist = new function() {
  16.     this.list = [];
  17.     this.loaded = false;
  18. };
  19.  
  20.  
  21. /*
  22.  * Checks whether there are whitelist entries matching the current request and
  23.  * returns either the whitelist decision (accept) or null if no match was found
  24.  */
  25. CsFire.Whitelist.decide = function(data) {
  26.     var src = data.referrer_host;
  27.     var dst = data.dst_host;
  28.     
  29.     var result = false;
  30.     var list = this.getList(); //Loads the list if this has not been done yet
  31.     for(var i in list) {
  32.         var item = list[i];
  33.         if(item) {
  34.             if(item.enabled && this.isMatch(dst, item.destination) && this.isMatch(src, item.origin)) {
  35.                 return { "action": CsFire.Policy.ACCEPT,
  36.                          "whitelist": true };
  37.             }
  38.         }
  39.     }
  40.     return null;
  41. }
  42.  
  43. /*
  44.  * Checks whether a certain URI matches agains a certain domain
  45.  */
  46. CsFire.Whitelist.isMatch = function(stringUri, domain) {
  47.     var result = true;
  48.     var splitUri;
  49.     stringUri == null ? splitUri = ["null"] : splitUri = stringUri.split(".");
  50.     var splitDomain = domain.split(".");
  51.     var indexUri = splitUri.length - 1;
  52.     var indexDomain = splitDomain.length - 1;
  53.     
  54.     while(indexUri >= 0 && indexDomain >= 0 && result) {
  55.         if(splitDomain[indexDomain] != "*" && (splitDomain[indexDomain] != splitUri[indexUri])) {
  56.             result = false;
  57.         }
  58.         indexUri--;
  59.         indexDomain--;
  60.     }
  61.  
  62.     //Check if the match has been completed 
  63.     //(e.g. domain=test.www.google.be and uri=www.google.be is not a match!)    
  64.     if(result && indexDomain >= 0) {
  65.         result = false;
  66.     }
  67.     
  68.     return result;
  69. }
  70.  
  71. /*
  72.  * Adds an entry to the whitelist using the provided origin and destination. If
  73.  * one of these is invalid, null is returned. Otherwise, the added rule is 
  74.  * returned as an object.
  75.  */
  76. CsFire.Whitelist.addEntry = function(origin, destination) {
  77.     var result = null;
  78.     try {
  79.         if(this.isValidDomain(origin) && this.isValidDomain(destination)) {
  80.             var theList = this.getList();
  81.             var exists = false;
  82.             for(var i = 0; i < theList.length && !exists; i++) {
  83.                 var item = theList[i];
  84.                 if(item && item.origin == origin && item.destination == destination) {
  85.                     exists = true;
  86.                 }
  87.             }
  88.     
  89.             if(!exists) {                
  90.                 var item = {"origin": origin,
  91.                             "destination": destination,
  92.                             "enabled": true};
  93.                 // Add item to end of list
  94.                 this.list.push(item);
  95.                 // Make the change persistent
  96.                 this.storeList();
  97.                 
  98.                 result = item;
  99.             }
  100.         }
  101.         else {
  102.             result = { "error": "Invalid input" };
  103.             if(!this.isValidDomain(origin)) {
  104.                 result.errororigin = true;
  105.             }
  106.             if(!this.isValidDomain(destination)) {
  107.                 result.errordestination = true;
  108.             }
  109.         }
  110.     }
  111.     catch(e) {
  112.         CsFire.Logger.error("Failed to add domain to whitelist: " + e);
  113.         result = { "error": "Error adding domain" };
  114.     }
  115.     return result;
  116. };
  117.  
  118. /*
  119.  * Changes the "enabled" status of an entry
  120.  */
  121. CsFire.Whitelist.updateEntryStatus = function(entry) {
  122.     var result = null;
  123.     var done = false;
  124.     for(var i = 0; i < this.list.length && !done; i++) {
  125.         var item = this.list[i];
  126.         if(item && item.origin == entry.origin && item.destination == entry.destination) {
  127.             CsFire.Logger.debug("Changing state of item to " + (!item.enabled));
  128.             item.enabled = !(item.enabled);
  129.             done = true;
  130.         }
  131.     }
  132.     this.storeList();
  133. };
  134.  
  135. /*
  136.  * Removes an entry from the whitelist
  137.  */
  138. CsFire.Whitelist.removeEntry = function(origin, destination) {
  139.     var result = true;
  140.     try {
  141.         /*
  142.          * Simply set the index to null. The item will be removed next time the
  143.          * browser is loaded and the list is retrieved from the prefs.
  144.          */
  145.         var done = false;
  146.         for(var i = 0; i < this.list.length && !done; i++) {
  147.             var item = this.list[i];
  148.             if(item && item.origin == origin && item.destination == destination) {
  149.                 delete this.list[i];
  150.                 done = true;
  151.             }
  152.         }
  153.         
  154.         // Make the change persistent
  155.         this.storeList();
  156.     }
  157.     catch(e) {
  158.         CsFire.Logger.error("Failed to remove domain from whitelist: " + e);
  159.         result = false;
  160.     }
  161.     return result;
  162. };
  163.  
  164. /*
  165.  * Returns a list of entries in the whitelist. Loads the list if this has not
  166.  * been done yet.
  167.  */
  168. CsFire.Whitelist.getList = function() {
  169.     // Load the list if this has not been done before
  170.     this.loadList();
  171.     return this.list;
  172. }
  173.  
  174. /*
  175.  * Checks whether the provided domain is a valid domain name
  176.  */
  177. CsFire.Whitelist.isValidDomain = function(domain) {
  178.     var result = true;
  179.     
  180.     var splitted = domain.split(".");
  181.     for(var i = 0; i < splitted.length && result; i++) {
  182.         var item = splitted[i];
  183.         if(item == null || item == "" || (item != "*" && !item.match(/^[a-zA-Z0-9\-_]+$/))) {
  184.             result = false;
  185.         }
  186.     }
  187.     
  188.     return result;    
  189. };
  190.  
  191.  
  192. /*
  193.  * Loads the list from the preferences into memory
  194.  */
  195. CsFire.Whitelist.loadList = function() {
  196.     // If loaded before, abort
  197.     if(this.loaded) return;
  198.     this.loaded = true;
  199.     
  200.     var s = CsFire.PreferenceUtils.getStringPreference("extensions.csfire.whitelist", null);
  201.     if(s) {
  202.  
  203.         var value = CsFire.nsJSON.decode(s);
  204.         for(var i in value) {
  205.             var entry = value[i];
  206.             if(entry != null) {
  207.                 this.list.push(entry);
  208.             }
  209.         }
  210.     }
  211. };
  212.  
  213. /*
  214.  * Stores the list from memory to preferences.
  215.  */
  216. CsFire.Whitelist.storeList = function() {
  217.     var storeList = this.getList();
  218.     var value = CsFire.nsJSON.encode(storeList);
  219.     CsFire.PreferenceUtils.setStringPreference("extensions.csfire.whitelist", value);
  220. };
  221.  
  222.